home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / stdwin / Ports / mac / timer.c < prev   
Text File  |  1995-12-21  |  2KB  |  81 lines

  1. /* MAC STDWIN -- TIMER. */
  2.  
  3. /* XXX The timer mechanism should be coupled less strongly with the
  4.    stdwin implementation -- stdwin should support a single timer,
  5.    while thin layers on top could implement various timer strategies. */
  6.  
  7. #include "macwin.h"
  8.  
  9. static unsigned long nexttimer;
  10.  
  11. /* Set a window's timer.
  12.    The second parameter is the number of deciseconds from now
  13.    when the timer is to go off, or 0 to clear the timer.
  14.    When the timer goes off (or sometime later),
  15.    a WE_TIMER event will be delivered.
  16.    As a service to 'checktimer' below, a NULL window parameter
  17.    is ignored, but causes the 'nexttimer' value to be recalculated.
  18.    (The inefficient simplicity of the code here is due to MINIX,
  19.    with some inventions of my own.) */
  20.  
  21. void
  22. wsettimer(win, deciseconds)
  23.     WINDOW *win;
  24.     int deciseconds;
  25. {
  26.     WindowPeek w;
  27.     
  28.     nexttimer= 0;
  29.     if (win != NULL) {
  30.         if (deciseconds == 0)
  31.             win->timer= 0;
  32.         else {
  33.             nexttimer= win->timer= TickCount() +
  34.                 deciseconds*(TICKSPERSECOND/10);
  35.         }
  36.     }
  37.     for (w= (WindowPeek)FrontWindow(); w != NULL; w= w->nextWindow) {
  38.         win= whichwin((WindowPtr)w);
  39.         if (win != NULL && win->timer != 0) {
  40.             if (nexttimer == 0 || win->timer < nexttimer)
  41.                 nexttimer= win->timer;
  42.         }
  43.     }
  44. }
  45.  
  46. /* Check if a timer went off.
  47.    If so, return TRUE and set the event record correspondingly;
  48.    otherwise, return FALSE. */
  49.  
  50. bool
  51. checktimer(ep)
  52.     EVENT *ep;
  53. {
  54.     WindowPtr w;
  55.     WINDOW *win;
  56.     unsigned long now;
  57.     
  58.     if (nexttimer == 0) {
  59.         return FALSE;
  60.     }
  61.     now= TickCount();
  62.     if (now < nexttimer) {
  63.         return FALSE;
  64.     }
  65.     ep->type= WE_NULL;
  66.     ep->window= NULL;
  67.     for (w= FrontWindow(); w != NULL;
  68.         w= (WindowPtr)((WindowPeek)w)->nextWindow) {
  69.         win= whichwin(w);
  70.         if (win != NULL && win->timer != 0) {
  71.             if (win->timer <= now) {
  72.                 ep->type= WE_TIMER;
  73.                 ep->window= win;
  74.                 now= win->timer;
  75.             }
  76.         }
  77.     }
  78.     wsettimer(ep->window, 0);
  79.     return ep->type == WE_TIMER;
  80. }
  81.